/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package mf.org.apache.xerces.dom.events;

import mf.org.w3c.dom.Node;
import mf.org.w3c.dom.events.MutationEvent;

/**
 * An implementation of the DOM Level 2 <code>MutationEvent</code> interface.
 * 
 * @xerces.internal 
 * 
 * @version $Id: MutationEventImpl.java 533531 2007-04-29 17:24:58Z mrglavas $
 */
public class MutationEventImpl 
    extends EventImpl 
    implements MutationEvent {
    
    Node relatedNode = null;
    String prevValue = null;
    String newValue = null;
    String attrName = null;

    // REVISIT: The DOM Level 2 PR has a bug: the init method should let this
    // attribute be specified. Since it doesn't we have to give write access.
    public short attrChange;

    // NON-DOM CONSTANTS: Storage efficiency, avoid risk of typos.
    public static final String DOM_SUBTREE_MODIFIED = "DOMSubtreeModified";
    public static final String DOM_NODE_INSERTED = "DOMNodeInserted";
    public static final String DOM_NODE_REMOVED = "DOMNodeRemoved";
    public static final String DOM_NODE_REMOVED_FROM_DOCUMENT = "DOMNodeRemovedFromDocument";
    public static final String DOM_NODE_INSERTED_INTO_DOCUMENT = "DOMNodeInsertedIntoDocument";
    public static final String DOM_ATTR_MODIFIED = "DOMAttrModified";
    public static final String DOM_CHARACTER_DATA_MODIFIED = "DOMCharacterDataModified";

    /** 
     * @return the name of the Attr which
     * changed, for DOMAttrModified events. 
     * Undefined for others.
     */
    public String getAttrName() {
        return attrName;
    }

    /**
     * <code>attrChange</code> indicates the type of change which triggered 
     * the DOMAttrModified event. The values can be <code>MODIFICATION</code>
     * , <code>ADDITION</code>, or <code>REMOVAL</code>. 
     */
    public short getAttrChange() {
        return attrChange;
    }

    /** 
     * @return the new string value of the Attr for DOMAttrModified events, or
     * of the CharacterData node for DOMCharDataModifed events.
     * Undefined for others.
     */
    public String getNewValue() {
        return newValue;
    }

    /** 
     * @return the previous string value of the Attr for DOMAttrModified events, or
     * of the CharacterData node for DOMCharDataModifed events.
     * Undefined for others.
     */
    public String getPrevValue() {
        return prevValue;
    }

    /** 
     * @return a Node related to this event, other than the target that the
     * node was dispatched to. For DOMNodeRemoved, it is the node which
     * was removed. 
     * No other uses are currently defined.
     */
    public Node getRelatedNode() {
        return relatedNode;
    }

    /** 
     * Initialize a mutation event, or overwrite the event's current
     * settings with new values of the parameters. 
     */
    public void initMutationEvent(String typeArg, boolean canBubbleArg, 
            boolean cancelableArg, Node relatedNodeArg, String prevValueArg, 
            String newValueArg, String attrNameArg, short attrChangeArg) {
        relatedNode = relatedNodeArg;
        prevValue = prevValueArg;
        newValue = newValueArg;
        attrName = attrNameArg;
        attrChange = attrChangeArg;
        super.initEvent(typeArg, canBubbleArg, cancelableArg);
    }
}
